/*******************************************************
  > Copyright (C) 2024 ==iot== All rights reserved.
  > File Name: 1.c
  > Author: wyf
  > Created Time: 2024年08月08日 星期四 16时39分17秒
 ***************************************************/


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dirent.h> //目录名获取配合DIR
#include <assert.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h> //文件控制操作
#include <sys/types.h> //获取pid等
#include <sys/wait.h> //等待子进程结束
#include <time.h> //时间获取
#include <sys/ipc.h> //进程通信
#include <sys/msg.h> //消息队列
#include <sys/shm.h> //共享内存
#include <signal.h> //信号处理
#include <pthread.h> //线程


typedef struct queue {
	int data;           
	struct queue* next;    
} Queue;

// 初始化头结点
Queue* create_queue() {
	Queue* head = (Queue*)malloc(sizeof(Queue)); 
	head->next = NULL;  
	return head;    
}

// 入队
void push(int data, Queue* head) {
	Queue* newNode = (Queue*)malloc(sizeof(Queue)); 
	newNode->data = data;      

	Queue* p = head; 
	while (p->next != NULL) { 
		p = p->next;
	}    


	p->next = newNode;      
	newNode->next = NULL;   
	p = newNode;
}

// 获取队列头的第一个数据
int front(Queue* head) {
	if (head->next == NULL) {   
		printf("Queue is empty\n");
		return -1;           
	}
	return head->next->data;    
}

// 出队
void pop(Queue* head) {
	if (head->next == NULL) {   
		printf("队列是空的!\n");
		return;
	}
	Queue* p = head->next; 
	head->next = head->next->next; 
	free(p); 
}

// 返回队列的大小
int size(Queue* head) {
	int count = 0;     
	Queue* p = head->next; 
	while (p != NULL) {  
		count++;    
		p = p->next;   
	}
	return count;  
}

// 判断队列是否为空
int isempty(Queue* head) {
	return head->next == NULL;  // 如果头结点的指针为空，返回1表示空；否则返回0
}

// 销毁队列
void destroy_queue(Queue* head) {
	Queue* p = head;    
	while (p != NULL) { 
		Queue* temp = p;
		p = p->next; 
		free(temp);  
	}
}


int main() {
	Queue* head = create_queue();  
	int i = 0;
	char j = 0;
	while(1){
		printf("请给队列输入值：输入-1是退出\n");
		scanf("%d",&i);
		if(i == -1)
		{
			break;
		}
		else{
			push(i, head);
		}
	}

	printf("当前第一个是： is %d\n", front(head));
	while(1){
		printf("输入k是出队，是否出队？\n") ;
		getchar();
		scanf("%c",&j);
		if(j == 'k'){
			pop(head);  // 出队
			printf("出队成功");
			printf("现在最新的一个元素是： %d\n", front(head));
		} 
		else{
			break;
		}

	}


	printf("现在最新的一个元素是： %d\n", front(head)); 


	printf("队列大小是： %d\n", size(head)); // 显示队列大小


	if(isempty(head)) {
		printf("队列是空的\n");
	} else {
		printf("队列不是空的\n");
	}





	// 销毁队列，释放内存
	destroy_queue(head);
	printf("已销毁队列\n");






	return 0;
}
